package com.wisely.highlight_springmvc4;

import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

import com.wisely.highlight_springmvc4.interceptor.DemoInterceptor;
import com.wisely.highlight_springmvc4.messageconverter.MyMessageConverter;

/**
 * @author GY
 * 2018年1月30日
 * SpringMVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类
 * 并在此类使用@EnableWebMvc注解开启一些默认配置
 * 重写继承类的方法，完成常用配置
 */
@Configuration
@EnableWebMvc// 1  默认会开启一些默认配置  开启SpringMVC支持
@EnableScheduling
@ComponentScan("com.wisely.highlight_springmvc4")
public class MyMvcConfig extends WebMvcConfigurerAdapter {// 2

	/**
	 * @return
	 * GY
	 * 2018年1月30日
	 * 设置视图渲染 jsp
	 * 配置相对路径
	 */
	@Bean
	public InternalResourceViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		//代码运行时代码会将我们的页面jsp自动编译到/WEB-INF/classes/views/下
		viewResolver.setPrefix("/WEB-INF/classes/views/");
		viewResolver.setSuffix(".jsp");
		viewResolver.setViewClass(JstlView.class);
		return viewResolver;
	}

	//addResourceLocations指的是文件放置的目录,addResourceHandler指的是对外暴露的访问路径
	//添加静态资源
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {

		registry.addResourceHandler("/assets/**").addResourceLocations(
				"classpath:/assets/");// 3

	}

	/**
	 * @return
	 * GY
	 * 2018年1月30日
	 * 生产一个拦截器Bean
	 */
	@Bean
	// 1
	public DemoInterceptor demoInterceptor() {
	    return new DemoInterceptor();
		//其他初始化设置 拦截路劲等
	}

	/*
	 * (non-Javadoc)
	 * 通过重写WebMvcConfigurerAdapter的addInterceptors方法来
	 * 注册自定义的拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {// 2
		registry.addInterceptor(demoInterceptor());
	}

	//此处配置可以省略一些无处理逻辑的页面转向
	//页面转向可以不用单独写Controller中
	/* (non-Javadoc)
	 * 快捷的ViewController
	 */
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
	    //直接转index.jsp
		registry.addViewController("/index").setViewName("/index");
		registry.addViewController("/toUpload").setViewName("/upload");
		registry.addViewController("/converter").setViewName("/converter");
		registry.addViewController("/sse").setViewName("/sse");
		registry.addViewController("/async").setViewName("/async");
	}

	 /* (non-Javadoc)
	 * 通过重写configurePathMatch方法可以不忽略路径参数中的xx.yy的yy的值
	 */
	@Override
	 public void configurePathMatch(PathMatchConfigurer configurer) {
	 configurer.setUseSuffixPatternMatch(false);
	 }

	/**
	 * @return
	 * GY
	 * 2018年1月31日
	 * Spring MVC通过配置一个MultipartResolver来上传文件
	 * 在Spring的控制器中,通过MultipartFile file来接收文件
	 * 通过MultipartFile[] files来接收多个文件上传
	 */
	@Bean
	public MultipartResolver multipartResolver() {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setMaxUploadSize(1000000);
		return multipartResolver;
	}
	
	/* (non-Javadoc)
	 * 注册自定义的HttpMessageConverter
	 * 添加一个自定义的HttpMessageConverter
	 * 不会覆盖默认的注册的HttpMessageConverter
	 * 如果覆盖 重载:configureMessageConverter方法
	 */
	@Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(converter());
    }
	
	/**
	 * @return
	 * GY
	 * 2018年1月31日
	 * 生产自定义的HttpMessageConverter Bean
	 */
	@Bean 
	public MyMessageConverter converter(){
		return new MyMessageConverter();
	}

	

}
